package com.rich.live.thread;

import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.*;

import java.io.File;
import java.io.IOException;

/**
 * @author hu
 * @version 1.0
 * @date 2021/08/26 12:24
 */
public class RecordVideoThread extends Thread {

    /**
     * 流地址
     */
    public String streamUrl;
    /**
     * 文件路径
     */
    public String filePath;
    /**
     * 案件id
     */
    public Integer id;

    public void setStreamUrl(String streamUrl) {
        this.streamUrl = streamUrl;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    @Override
    public void run() {
        //输出流地址
        System.out.println(streamUrl);
        // 获取视频源
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(streamUrl);

        FFmpegFrameRecorder recorder = null;

        try {
            //开启
            grabber.start();
            //抓取帧数
            Frame frame = grabber.grabFrame();
            if (frame != null) {
                File outFile = new File(filePath);
                if (!outFile.isFile()) {
                    try {
                        outFile.createNewFile();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                // 流媒体输出地址，分辨率（长，高），是否录制音频（0:不录制/1:录制）
                recorder = new FFmpegFrameRecorder(filePath, 1280, 720, 1);
                // 直播流格式
                recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
                // 录制的视频格式
                recorder.setFormat("flv");
                // 帧数
                recorder.setFrameRate(25);
                //百度翻译的比特率，默认400000，但是我400000贼模糊，调成800000比较合适
                recorder.setVideoBitrate(2400000);
                recorder.start();
                while ((frame != null)) {
                    // 录制
                    recorder.record(frame);
                    // 获取下一帧
                    frame = grabber.grabFrame();
                }
                recorder.record(frame);
                // 停止录制
                recorder.stop();
                grabber.stop();
            }
        } catch (FrameGrabber.Exception e) {
            e.printStackTrace();
        } catch (FrameRecorder.Exception e) {
            e.printStackTrace();
        } finally {
            if (null != grabber) {
                try {
                    grabber.stop();
                } catch (FrameGrabber.Exception e) {
                    e.printStackTrace();
                }
            }
            if (recorder != null) {
                try {
                    recorder.stop();
                } catch (FrameRecorder.Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }


}